#!/usr/bin/perl
#file count-lines.pl

# IO::Handle 和 IO::File 都是perl的标准组件，一起提供了面向对象接口。
# IO::File 提供了充分的理由选择面向对象，
# 而且 IO::Socket 和 IO::Pipe 和其他的IO相关模块也从IO::Handle集成了它们的行为。

use strict;
use IO::File;
my $file = shift;
my $counter = 0;
my $fh = IO::File->new($file) or die "Cannot open $file: $!\r\n";
while (defined(my $line = $fh->getline)){
    $counter++;
}
STDOUT->print("counted $counter lines\n");

# IO::File 对象实际是“神圣”的，这意味着可以以面向对象风格来使用它们：
# $fh->print("function calls.\n");
# 等价于
# print $fh "function calls.\n";

# 许多io file的方法都是perl的内置函数简单封装。read，syswrite，close等方法也是。

# 装入 io file 时（技术上，是当io file装入 io handle时， iofile 继承 iohandle），
# 它将方法添加给普通文件句柄， 意味着 iofile中任意方法也能用于STDIN STDOUT STDERR 甚至普通句柄。